package br.com.concretesolutions.canarinho.sample;
import android.os.Build;
import android.support.test.espresso.UiController;
import android.support.test.espresso.ViewAction;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.view.View;
import android.widget.EditText;
import android.widget.SearchView;
import org.hamcrest.Matcher;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import br.com.concretesolutions.canarinho.sample.ui.activity.MainActivity;
import br.com.concretesolutions.canarinho.sample.ui.model.Watchers;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.clearText;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.action.ViewActions.pressBack;
import static android.support.test.espresso.action.ViewActions.scrollTo;
import static android.support.test.espresso.action.ViewActions.typeText;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.supportsInputMethods;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.anyOf;
@RunWith(AndroidJUnit4.class)
public class DemoWatchersInstrumentationTest {
@Rule
public ActivityTestRule<MainActivity> rule = new ActivityTestRule<>(MainActivity.class);
@Test
public void consegueDigitarUmBoletoNormalValido() throws InterruptedException {
navigateToTab(Watchers.BOLETO_BANCARIO);
Thread.sleep(1000L);
onView(allOf(withId(R.id.edit_text), isDisplayed()))
.perform(typeText("34199310130010011560900500990007800000000000000"));
onView(withText("Campo válido!")).check(matches(isDisplayed()));
}
@Test
public void consegueValidarUmBoletoSetandoOCodigoInteiro() throws InterruptedException {
navigateToTab(Watchers.BOLETO_BANCARIO);
onView(allOf(withId(R.id.edit_text), isDisplayed()))
.perform(paste("34199310130010011560900500990007800000000000000"));
Thread.sleep(1000L);
onView(withText("Campo válido!")).check(matches(isDisplayed()));
}
@Test
public void consegueValidarUmBoletoTributoSetandoOCodigoInteiro() throws InterruptedException {
navigateToTab(Watchers.BOLETO_BANCARIO);
onView(allOf(withId(R.id.edit_text), isDisplayed()))
.perform(paste("812345678901812345678901812345678901812345678901"));
Thread.sleep(1000L);
onView(withText("Campo válido!")).check(matches(isDisplayed()));
}
@Test
public void consegueDigitarUmBoletoNormalComBlocosInvalidos() throws InterruptedException {
navigateToTab(Watchers.BOLETO_BANCARIO);
// primeiro
onView(allOf(withId(R.id.edit_text), isDisplayed()))
.perform(typeText("23790125016"));
onView(withText("Primeiro bloco inválido")).check(matches(isDisplayed()));
// segundo
onView(allOf(withId(R.id.edit_text), isDisplayed()))
.perform(clearText(), typeText("2379012301600000030054"));
onView(withText("Segundo bloco inválido")).check(matches(isDisplayed()));
// terceiro
onView(allOf(withId(R.id.edit_text), isDisplayed()))
.perform(clearText(), typeText("23790123016000000005325000456708"));
onView(withText("Terceiro bloco inválido")).check(matches(isDisplayed()));
}
@Test
public void consegueDigitarUmBoletoTributoValido() throws InterruptedException {
navigateToTab(Watchers.BOLETO_BANCARIO);
// Boleto válido
onView(allOf(withId(R.id.edit_text), isDisplayed()))
.perform(typeText("848600000015523301622010506101307129620012111220"));
onView(withText("Campo válido!"))
.check(matches(isDisplayed()))
.perform(pressBack());
onView(allOf(withId(R.id.edit_text), isDisplayed()))
.perform(clearText(), typeText("836600000019078800481000998854924516001265611135"));
onView(withText("Campo válido!"))
.check(matches(isDisplayed()))
.perform(pressBack());
}
@Test
public void consegueDigitarUmBoletoNormalComBlocosInvalidosComMensagemCustomizada() throws InterruptedException {
navigateToTab(Watchers.BOLETO_BANCARIO_MSG_CUSTOM);
// primeiro
onView(allOf(withId(R.id.edit_text), isDisplayed()))
.perform(typeText("23790125016"));
onView(withText("Primeira mensagem")).check(matches(isDisplayed()));
// segundo
onView(allOf(withId(R.id.edit_text), isDisplayed()))
.perform(clearText(), typeText("2379012301600000030054"));
onView(withText("Segunda mensagem")).check(matches(isDisplayed()));
// terceiro
onView(allOf(withId(R.id.edit_text), isDisplayed()))
.perform(clearText(), typeText("23790123016000000005325000456708"));
onView(withText("Terceira mensagem")).check(matches(isDisplayed()));
}
@Test
public void consegueDigitarUmCPFValido() throws InterruptedException {
navigateToTab(Watchers.CPF);
onView(allOf(withId(R.id.edit_text), isDisplayed())).perform(typeText("46574356636"));
onView(withText("Campo válido!"))
.check(matches(isDisplayed()))
.perform(pressBack());
}
@Test
public void consegueDigitarUmCPFInvalido() throws InterruptedException {
navigateToTab(Watchers.CPF);
onView(allOf(withId(R.id.edit_text), isDisplayed())).perform(typeText("46574356637"));
onView(withText("CPF inválido")).check(matches(isDisplayed()));
}
@Test
public void consegueDigitarUmCNPJValido() throws InterruptedException {
navigateToTab(Watchers.CNPJ);
onView(allOf(withId(R.id.edit_text), isDisplayed())).perform(typeText("95621433000170"));
onView(withText("Campo válido!"))
.check(matches(isDisplayed()))
.perform(pressBack());
}
@Test
public void consegueDigitarUmCNPJInvalido() throws InterruptedException {
navigateToTab(Watchers.CNPJ);
onView(allOf(withId(R.id.edit_text), isDisplayed())).perform(typeText("95621433000180"));
onView(withText("CNPJ inválido")).check(matches(isDisplayed()));
}
@Test
public void consegueDigitarUmTelefoneValido() throws InterruptedException {
navigateToTab(Watchers.TELEFONE);
onView(allOf(withId(R.id.edit_text), isDisplayed())).perform(typeText("1112345678"));
onView(withText("Campo válido!"))
.check(matches(isDisplayed()))
.perform(pressBack());
onView(allOf(withId(R.id.edit_text), isDisplayed())).perform(typeText("11123456789"));
onView(withText("Campo válido!"))
.check(matches(isDisplayed()))
.perform(pressBack());
}
@Test
public void consegueDigitarUmValorMonetarioFormatado() throws Throwable {
navigateToTab(Watchers.VALOR_MONETARIO);
onView(allOf(withId(R.id.edit_text), isDisplayed()))
.perform(typeText("1"))
.check(matches(withText("0,01"))) // inicia com 0,0X
.perform(typeText("2"))
.check(matches(withText("0,12"))) // 0,XY
.perform(typeText("3"))
.check(matches(withText("1,23"))) // X,YZ
.perform(typeText("4"))
.check(matches(withText("12,34"))) // etc, etc, etc
.perform(typeText("5"))
.check(matches(withText("123,45")))
.perform(typeText("6"))
.check(matches(withText("1.234,56")))
.perform(typeText("7"))
.check(matches(withText("12.345,67")))
.perform(typeText("8"))
.check(matches(withText("123.456,78")))
.perform(typeText("9"))
.check(matches(withText("1.234.567,89")));
}
@Test
public void consegueDigitarCPFCNPJValido() throws Throwable {
navigateToTab(Watchers.CPF_CNPJ);
onView(allOf(withId(R.id.edit_text), isDisplayed())).perform(typeText("46574356636"));
onView(withText("Campo válido!")).check(matches(isDisplayed())).perform(pressBack());
onView(allOf(withId(R.id.edit_text), isDisplayed())).perform(clearText(), typeText("95621433000170"));
onView(withText("Campo válido!")).check(matches(isDisplayed()));
}
@Test
public void consegueDigitarCPFCNPJInvalido() throws Throwable {
navigateToTab(Watchers.CPF_CNPJ);
onView(allOf(withId(R.id.edit_text), isDisplayed())).perform(typeText("46574356637"));
onView(withText("CPF inválido")).check(matches(isDisplayed()));
onView(allOf(withId(R.id.edit_text), isDisplayed())).perform(clearText(), typeText("15621433000180"));
onView(withText("CNPJ inválido")).check(matches(isDisplayed()));
}
@Test
public void consegueDigitarUmCEPValido() throws Throwable {
navigateToTab(Watchers.CEP);
onView(allOf(withId(R.id.edit_text), isDisplayed())).perform(typeText("49025090"));
onView(withText("Campo válido!"))
.check(matches(isDisplayed()));
}
@Test
public void consegueUtilizarUmaMascaraGenericaSemValidadorOuEvento() throws Throwable {
navigateToTab(Watchers.MASCARA_GENERICA);
onView(allOf(withId(R.id.edit_text), isDisplayed()))
.perform(typeText("12345"))
.check(matches(withText("1-2-3-4-5")));
}
private void navigateToTab(Watchers watcher) throws InterruptedException {
onView(
allOf(
withText(watcher.getTitle()),
isDescendantOfA(withId(R.id.tabs)))
)
.perform(scrollTo(), click());
Thread.sleep(500L);
}
private ViewAction paste(final String type) {
return new ViewAction() {
@Override
public Matcher<View> getConstraints() {
// noinspection unchecked
Matcher<View> matchers = allOf(isDisplayed());
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
return allOf(matchers, supportsInputMethods());
} else {
// SearchView does not support input methods itself (rather it delegates to an internal text
// view for input).
return allOf(matchers, anyOf(supportsInputMethods(), isAssignableFrom(SearchView.class)));
}
}
@Override
public String getDescription() {
return "Straight typing into view";
}
@Override
public void perform(UiController uiController, View view) {
((EditText) view).setText(type);
}
};
}
}